/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.evangelion.core.controller;

import com.evangelion.core.bean.Alumno;
import com.evangelion.core.bean.FacturaAlumno;
import com.evangelion.core.bean.Seccione;
import com.evangelion.core.bean.Usuario;
import com.evangelion.core.daoImpl.ConnectionUtil;
import com.evangelion.core.utils.MensajesFace;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;
import org.primefaces.context.RequestContext;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.Serializable;
import java.sql.Connection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 *
 * @author Kellycasma
 */
@ManagedBean
@ViewScoped
public class FacturaAlumnoController extends MensajesFace implements Serializable {

    private FacturaAlumno facalumno;

    private Alumno alumno;
    private String valorBusqueda;
    private String searchParamAlumno;
    private Date fechadesde;
    private Date fechahasta;
    boolean renderTable;

    private LazyDataModel<Alumno> listAlumno;
    private LazyDataModel<FacturaAlumno> listaFacturaAlumno;
    private LazyDataModel<FacturaAlumno> listaFacturaAlumno2;
    private Date fechaI;
    private Date fechaF;
    private DefaultStreamedContent dc;
    private int idFacturaAlumno;

    @PostConstruct
    @Override
    public void init() {
        super.init();
        facalumno = new FacturaAlumno();
        alumno = new Alumno();
//        listaFacturaAlumno2 = fas.findByRangeDate(seccion, "", new Date(), new Date());
    }

    public void printPDFfactura(Map parameters, String archivo, int id) {
        try {
            Connection conexion = connectionUtil.getConnection();
            String urlMaster = ConnectionUtil.getServletContext().getRealPath(REPORT_FOLDER + archivo);
            JasperReport reporteMaster = null;
            try {
                reporteMaster = (JasperReport) JRLoader.loadObject(urlMaster);
            } catch (Exception e) {
                e.printStackTrace();
            }
            JasperPrint print = JasperFillManager.fillReport(reporteMaster, parameters, conexion);

            byte[] bytes = JasperExportManager.exportReportToPdf(print);

            System.out.println("byte: " + bytes.length);
            if (bytes.length >= 1211 && bytes.length <= 1400) {
                System.out.println("tamano menor");
                dc = null;
                System.out.println("El reporte no genero ningun resultado");
            } else {
                InputStream stream = new ByteArrayInputStream(bytes);
                dc = new DefaultStreamedContent(stream, "application/pdf", "/general/factura_" + id + ".pdf");
                System.out.println("Reporte generado exitosamente : " + dc.getStream().toString());
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void imprimirFactura(ActionEvent e) {
        String archivo = "resporteFacturaArenal.jasper";
        Map parameters = new HashMap();
        parameters.put("id", getIdFacturaAlumno());
        printPDFfactura(parameters, archivo, getIdFacturaAlumno());
    }

    public void factxLote() {
        String archivo = "reporteFacturaLote.jasper";
        Map parameters = new HashMap();
        parameters.put("fechaI", fechaI);
        parameters.put("fechaF", fechaF);
        printpdf(parameters, archivo, "listafactura");
    }

    public void printpdf(Map parameters, String archivo, String namePrin) {
        try {
            Connection conexion = connectionUtil.getConnection();
            String urlMaster = ConnectionUtil.getServletContext().getRealPath(REPORT_FOLDER + archivo);
            JasperReport reporteMaster = null;
            try {
                reporteMaster = (JasperReport) JRLoader.loadObject(urlMaster);
            } catch (Exception e) {
                e.printStackTrace();
            }
            JasperPrint print = null;
            print = JasperFillManager.fillReport(reporteMaster, parameters, conexion);
            byte[] bytes = JasperExportManager.exportReportToPdf(print);
            System.out.println("byte: " + bytes.length);
            if (bytes.length >= 1211 && bytes.length <= 1608) {
                System.out.println("tamano menor");
                dc = null;
                System.out.println("El reporte no genero ningun resultado");
            } else {
                InputStream stream = new ByteArrayInputStream(bytes);
                dc = new DefaultStreamedContent(stream, "application/pdf", namePrin + ".pdf");
                System.out.println("Reporte generado exitosamente.");
            }

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void search2() {
        configDataModelFacAlum2();
    }

    public void search() {
        System.out.println("C");
        configDataModelFacAlum();
    }

    @SuppressWarnings("serial")
    public void configDataModelFacAlum2() {
        listaFacturaAlumno2 = new LazyDataModel<FacturaAlumno>() {
            @Override
            public List<FacturaAlumno> load(int start, int max, String arg2,
                    SortOrder arg3, Map<String, String> arg4) {
                if (valorBusqueda == null) {
                    valorBusqueda = "";
                }
                return fas.findByRangeDate(seccion, "", fechaI, fechaF, start, max);

            }
        };
        listaFacturaAlumno2.setRowCount(fas.countPage(seccion, "", fechaI, fechaF));
    }

    // @SuppressWarnings("serial")
    public void configDataModelFacAlum() {
        System.out.println("A");

        listaFacturaAlumno = new LazyDataModel<FacturaAlumno>() {
            @Override
            public List<FacturaAlumno> load(int start, int max, String arg2,
                    SortOrder arg3, Map<String, String> arg4) {
                System.out.println("B");
                if (valorBusqueda == null) {
                    valorBusqueda = "";
                    System.out.println("k");

                } else {
                    System.out.println("J");

                }
                return fas.findByRangeDate(seccion, valorBusqueda, fechadesde, fechahasta, start, max);

            }
        };
        listaFacturaAlumno.setRowCount(fas.countPage(seccion, valorBusqueda, fechadesde, fechahasta));
    }

    public void buscarListaAlumno() {
        configDataModel();
        renderTable = true;
        System.out.println("");
    }

    @SuppressWarnings("serial")
    public void configDataModel() {
        listAlumno = new LazyDataModel<Alumno>() {
            @Override
            public List<Alumno> load(int start, int max, String arg2,
                    SortOrder arg3, Map<String, String> arg4) {

                String searchParam = getSearchParamAlumno();
                if (searchParam == null) {
                    searchParam = "";
                }
                List<Alumno> listaAlu = (List) serviceAlunmo.searchByNifNombre(seccion, searchParam, start, max);
                return listaAlu;
            }
        };
        listAlumno.setRowCount(serviceAlunmo.countPage(seccion, getSearchParamAlumno()));
    }

    public void onRowSelectAlumno(Alumno alum) {
        renderTable = false;
        alumno = alum;
        setSearchParamAlumno(alum.getNombres() + " " + alum.getApellidos());
        RequestContext.getCurrentInstance().update(":formalumno:tabView:idfactalumno");
    }

    public FacturaAlumno getFacalumno() {
        return facalumno;
    }

    public void setFacalumno(FacturaAlumno facalumno) {
        this.facalumno = facalumno;
    }

    public Seccione getSeccion() {
        return seccion;
    }

    public void setSeccion(Seccione seccion) {
        this.seccion = seccion;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public String getValorBusqueda() {
        return valorBusqueda;
    }

    public void setValorBusqueda(String valorBusqueda) {
        this.valorBusqueda = valorBusqueda;
    }

    public String getSearchParamAlumno() {
        return searchParamAlumno;
    }

    public void setSearchParamAlumno(String searchParamAlumno) {
        this.searchParamAlumno = searchParamAlumno;
    }

    public Date getFechadesde() {
        return fechadesde;
    }

    public void setFechadesde(Date fechadesde) {
        this.fechadesde = fechadesde;
    }

    public Date getFechahasta() {
        return fechahasta;
    }

    public void setFechahasta(Date fechahasta) {
        this.fechahasta = fechahasta;
    }

    public Alumno getAlumno() {
        return alumno;
    }

    public void setAlumno(Alumno alumno) {
        this.alumno = alumno;
    }

    public boolean isRenderTable() {
        return renderTable;
    }

    public void setRenderTable(boolean renderTable) {
        this.renderTable = renderTable;
    }

    public DefaultStreamedContent getDc() {
        return dc;
    }

    public void setDc(DefaultStreamedContent dc) {
        this.dc = dc;
    }

    public Date getFechaI() {
        return fechaI;
    }

    public void setFechaI(Date fechaI) {
        this.fechaI = fechaI;
    }

    public Date getFechaF() {
        return fechaF;
    }

    public void setFechaF(Date fechaF) {
        this.fechaF = fechaF;
    }

    public LazyDataModel<Alumno> getListAlumno() {
        return listAlumno;
    }

    public void setListAlumno(LazyDataModel<Alumno> listAlumno) {
        this.listAlumno = listAlumno;
    }

    public LazyDataModel<FacturaAlumno> getListaFacturaAlumno() {
        return listaFacturaAlumno;
    }

    public void setListaFacturaAlumno(LazyDataModel<FacturaAlumno> listaFacturaAlumno) {
        this.listaFacturaAlumno = listaFacturaAlumno;
    }

    public LazyDataModel<FacturaAlumno> getListaFacturaAlumno2() {
        return listaFacturaAlumno2;
    }

    public void setListaFacturaAlumno2(LazyDataModel<FacturaAlumno> listaFacturaAlumno2) {
        this.listaFacturaAlumno2 = listaFacturaAlumno2;
    }

    /**
     * @return the idFacturaAlumno
     */
    public int getIdFacturaAlumno() {
        return idFacturaAlumno;
    }

    /**
     * @param idFacturaAlumno the idFacturaAlumno to set
     */
    public void setIdFacturaAlumno(int idFacturaAlumno) {
        this.idFacturaAlumno = idFacturaAlumno;
    }

    public void resetInput() {
        setSearchParamAlumno("");
    }
}